import { sleep } from '../../util.js'
import playwrightApi from '../playwright.js'

// const browser = await chromium.launch({
//   headless: false,
// });
// const context = await browser.newContext();

let page

class GPT {
  async go() {
    const { context } = playwrightApi

    page = await context.newPage()
    await page.goto('https://grok.com/')
  }

  async upload(filePath = 'D:\\test.txt', prompt = '总结一下文档') {
    const { context } = playwrightApi

    console.log('开始上传')

    if (page) {
      await page.goto('https://grok.com/')
    } else {
      console.log('新开页面')
      page = await context.newPage()
      await page.goto('https://grok.com/')
    }

    // 监听文件选择框弹出事件
    const [fileChooser] = await Promise.all([
      page.waitForEvent('filechooser'),
      // page.waitForEvent('filechooser'), // 等待文件选择框出现
      // page.click('#upload-button'),     // 点击上传按钮（替换成你的按钮选择器）
      // page.getByTestId('composer-plus-btn').click(),
      page.click('#radix-«r28»'),
      page.getByText('上传文件').click(),
    ])

    console.log('设置要上传的文件路径')

    // 设置要上传的文件路径（可以是单个文件或数组）
    await fileChooser.setFiles(filePath) // 替换成你的文件路径

    await page.locator('#prompt-textarea').fill(prompt)

    // 等待上传完成，可以发送
    // await page.waitForFunction(
    //   () => document.querySelector('#composer-submit-button')?.disabled === false,
    //   null,
    //   { timeout: 5 * 60 * 1000 }
    // )
    await page.waitForSelector('#composer-submit-button:not([disabled])', {
      timeout: 5 * 60 * 1000,
    })

    console.log('开始发送')

    // 等几秒，有时候收不到文件
    await sleep(3000)

    // 然后点击
    await page.locator('#composer-submit-button').click()

    const result = await Promise.race([
      page
        .waitForSelector('[data-testid="suggest_message_list"]', {
          timeout: 0,
        })
        .then(() => 'suggest_message_list'),
      page
        .waitForSelector('[data-testid="doc_card"]', {
          timeout: 0,
        })
        .then(() => 'doc_card'),
    ])

    console.log('result', result)
    if (result === 'doc_card') {
      console.log('等待回答')
      // 等待回答完成
      await page.waitForSelector('[data-testid="audio_play_button"]', {
        timeout: 0,
      })
      console.log('报告回答完成')
    }

    // const controller = new AbortController()

    // try {
    //   const result = await Promise.race([
    //     page
    //       .waitForSelector('[data-testid="suggest_message_list"]', {
    //         timeout: 0,
    //         signal: controller.signal, // 绑定 AbortSignal
    //       })
    //       .then(() => 'suggest_message_list'),

    //     page
    //       .waitForSelector('[data-testid="doc_card"]', {
    //         timeout: 0,
    //         signal: controller.signal, // 绑定 AbortSignal
    //       })
    //       .then(() => 'doc_card'),
    //   ])

    //   console.log(`出现的选择器是: ${result}`)
    //   controller.abort() // 取消另一个等待
    // } catch (err) {
    //   console.error('等待出错:', err)
    // }

    const zoneCount = await page.locator('.zone-container').count()

    console.log('zoneCount', zoneCount)

    let text
    if (zoneCount > 0) {
      console.log('从报告中获取')
      // 从 .zone-container 获取文本
      // text = await page.locator('.zone-container').textContent()
      text = await page.$eval('.zone-container', el => el.innerText)
    } else {
      console.log('从回到中获取')
      // 从 message_text_content 获取文本
      // text = await page.locator('[data-testid="message_text_content"]').last().textContent()
      // text = await page.$eval('[data-testid="message_text_content"]', el => el.innerText)
      text = await page.evaluate(() => {
        const elements = document.querySelectorAll('[data-testid="message_text_content"]')
        return elements[elements.length - 1].innerText
      })
    }

    console.log('回答结束')

    return text

    // await context.close();
    // await browser.close();
  }

  async prompt(prompt = '总结一下文档') {
    console.log('开始上传')

    if (page) {
      console.log('已打开页面')
      // await page.getByTestId('create_conversation_button').click()
      // data-testid="immersive_side_bar_chat"
      // page.getByText('新对话').first().click()
      // await page.getByTestId('create_conversation_button').getByText('新对话').click()
      await page.goto('https://www.doubao.com/chat/')
    } else {
      console.log('新开页面')
      page = await context.newPage()
      await page.goto('https://www.doubao.com/chat/')
    }

    await page.getByTestId('chat_input').locator('textarea').fill(prompt)

    // 等待上传完成，可以发送
    await page.waitForFunction(
      () => {
        const button = document.querySelector('#flow-end-msg-send')
        return button?.getAttribute('aria-disabled') === 'false'
      },
      undefined,
      { timeout: 5 * 60 * 1000 }
    )

    console.log('开始发送')

    // 等几秒，有时候收不到文件
    await sleep(3000)

    // 然后点击
    await page.locator('#flow-end-msg-send').click()

    // await page.waitForSelector('[data-testid="suggest_message_list"]', {
    //   timeout: 0, // 0 表示无限等待
    // })

    const result = await Promise.race([
      page
        .waitForSelector('[data-testid="suggest_message_list"]', {
          timeout: 0,
        })
        .then(() => 'suggest_message_list'),
      page
        .waitForSelector('[data-testid="audio_play_button"]', {
          timeout: 0,
        })
        .then(() => 'audio_play_button'),
      page
        .waitForSelector('[data-testid="doc_card"]', {
          timeout: 0,
        })
        .then(() => 'doc_card'),
    ])

    console.log('result', result)
    if (result === 'doc_card') {
      console.log('等待回答')
      // 等待回答完成
      await page.waitForSelector('[data-testid="audio_play_button"]', {
        timeout: 0,
      })
      console.log('报告回答完成')
    }

    // const controller = new AbortController()

    // try {
    //   const result = await Promise.race([
    //     page
    //       .waitForSelector('[data-testid="suggest_message_list"]', {
    //         timeout: 0,
    //         signal: controller.signal, // 绑定 AbortSignal
    //       })
    //       .then(() => 'suggest_message_list'),

    //     page
    //       .waitForSelector('[data-testid="doc_card"]', {
    //         timeout: 0,
    //         signal: controller.signal, // 绑定 AbortSignal
    //       })
    //       .then(() => 'doc_card'),
    //   ])

    //   console.log(`出现的选择器是: ${result}`)
    //   controller.abort() // 取消另一个等待
    // } catch (err) {
    //   console.error('等待出错:', err)
    // }

    const zoneCount = await page.locator('.zone-container').count()

    console.log('zoneCount', zoneCount)

    let text
    if (zoneCount > 0) {
      console.log('从报告中获取')
      // 从 .zone-container 获取文本
      // text = await page.locator('.zone-container').textContent()
      text = await page.$eval('.zone-container', el => el.innerText)
    } else {
      console.log('从回到中获取')

      const languageJsonCount = await page.locator('.language-json').count()

      console.log('languageJsonCount', languageJsonCount)

      if (languageJsonCount) {
        text = await page.locator('.language-json').last().textContent()
      } else {
        text = await page.locator('[data-testid="message_text_content"]').last().textContent()
      }
    }

    console.log('回答结束')

    return text

    // await context.close();
    // await browser.close();
  }
}

export default new GPT()
